﻿/*
SINACOR - BMF&Bovespa
Arquivo: AcertoIRRF.cs
Criado em: 23-jun-2010 10:46:29
Arquiteto Responsável: p-ksantos
*/
using System;
using System.Collections.Generic;
using System.Text;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation;


namespace Sinacor.Servico.Bovespa.Movimento.BusinessLogic 
{
    /// <summary>
    /// Class AcertoIRRF
    /// </summary>
	public class AcertoIRRF : BaseBusinessLogic 
	{
		#region Atributos
		/// <summary>
		/// msg: "Falha na alteração. Operação não realizada."
		/// </summary>
		private int _erroAlteracaoAcertoIRRF = 520021;
		/// <summary>
		/// msg: "Cliente não pertence ao grupo de assessores do usuário ou não está ativo.
		/// "
		/// </summary>
		private int _erroClienteInvalido = 520019;
		/// <summary>
		/// msg: "Data Inválida para Pregão."
		/// </summary>
		private int _erroDataPregaoInvalida = 520020;
		/// <summary>
		/// msg: "Código ou CPF/CNPJ do Cliente deve ser informado."
		/// </summary>
		private int _erroFiltroObrigatorio = 520015;
		/// <summary>
		/// msg: "Falha na inclusão. Operação não realizada."
		/// </summary>
		private int _erroInclusaoAcertoIRRF = 520018;
		private ResourceAccess.AcertoIRRF _raAcertoIRRF;
        /// <summary>
        /// msg: "Datas informadas não são válidas."
        /// </summary>
        private int _erroPeriodoInvalido = 520022;
		#endregion

		#region Propriedades
		public int ErroAlteracaoAcertoIRRF
		{
			get { return _erroAlteracaoAcertoIRRF; }
			set { _erroAlteracaoAcertoIRRF = value; }
		}

		public int ErroClienteInvalido
		{
			get { return _erroClienteInvalido; }
			set { _erroClienteInvalido = value; }
		}

		public int ErroDataPregaoInvalida
		{
			get { return _erroDataPregaoInvalida; }
			set { _erroDataPregaoInvalida = value; }
		}

		public int ErroFiltroObrigatorio
		{
			get { return _erroFiltroObrigatorio; }
			set { _erroFiltroObrigatorio = value; }
		}

		public int ErroInclusaoAcertoIRRF
		{
			get { return _erroInclusaoAcertoIRRF; }
			set { _erroInclusaoAcertoIRRF = value; }
		}

        public int ErroPeriodoInvalido
        {
            get { return _erroPeriodoInvalido;}
            set { _erroPeriodoInvalido = value; }
        }
		#endregion

        #region Construtor
        public AcertoIRRF()
        {
            _raAcertoIRRF = new Sinacor.Servico.Bovespa.Movimento.ResourceAccess.AcertoIRRF();
        }
        #endregion

        #region Métodos
        /// <summary>
		/// Altera acerto IRRF.
		/// </summary>
		/// <param name="entity"></param>
		public void AlterarAcertoIRRF(BusinessEntity.AcertoIRRF entity)
		{
            this.ValidarAcertoIRRF(entity);

            entity.ValorBase = entity.ValorBase + entity.AcertoBase;

            entity.ValorRetido = entity.ValorRetido + entity.AcertoIRRetido;

            try
            {
                _raAcertoIRRF.AlterarAcertoIRRF(entity);      
            }
            catch
            {
                throw new BusinessException(ErroAlteracaoAcertoIRRF);
            }                        			
		}

		/// <summary>
		/// Disponibiliza uma lista de acertos IRRF.
		/// </summary>
		/// <param name="entity"></param>
		public List<BusinessEntity.AcertoIRRF> ConsularAcertosIRRF(BusinessEntity.Parameter.FiltroAcertoIRRF entity)
		{
            List<BusinessEntity.AcertoIRRF> retorno = null;

            SinacorValidation validation = new SinacorValidation();
            validation.AddValidation<BusinessEntity.Parameter.FiltroAcertoIRRF>(entity);
            validation.Validate();

            if (entity.Periodo.DataInicial.HasValue && entity.Periodo.DataFinal.HasValue)
            {
                if (entity.Periodo.DataInicial > entity.Periodo.DataFinal)
                    throw new BusinessException(ErroPeriodoInvalido);
            }

            if (!entity.CodigoCliente.HasValue && !entity.CPFCNPJ.HasValue)         
                throw new BusinessException(ErroFiltroObrigatorio);                
            else
                retorno = _raAcertoIRRF.ConsularAcertosIRRF(entity);         
                

            return retorno;
		}

		/// <summary>
		/// Disponibiliza uma lista de Bolsas.
		/// </summary>
		public List<BusinessEntity.Bolsa> ConsultarBolsas()
		{
            return _raAcertoIRRF.ConsultarBolsas();			
		}

		/// <summary>
		/// Disponibilizar uma lista de dias para liquidação.
		/// </summary>
		public List<BusinessEntity.DiasLiquidacaoAcerto> ConsultarDiasLiquidacao()
		{
            return _raAcertoIRRF.ConsultarDiasLiquidacao();			
		}

		/// <summary>
		/// Inclui acerto IRRF.
		/// </summary>
		/// <param name="entity"></param>
		public void IncluirAcertoIRRF(BusinessEntity.AcertoIRRF entity)
		{
            this.ValidarAcertoIRRF(entity);
            
            try
            {
                _raAcertoIRRF.IncluirAcertoIRRF(entity);
            }
            catch
            {
                throw new BusinessException(ErroInclusaoAcertoIRRF);
            }			
		}

		/// <summary>
		/// Obtém a data do movimento.
		/// </summary>
		public DateTime ObterDataMovimento()
		{
			return _raAcertoIRRF.ObterDataMovimento();			
		}

		/// <summary>
		/// Verifica se é dia útil.
		/// </summary>
		/// <param name="entity"></param>
		public DateTime ObterProximoDiaUtil(BusinessEntity.AcertoIRRF entity)
		{
            return _raAcertoIRRF.ObterProximoDiaUtil(entity);			
		}

		/// <summary>
		/// Valida informações do Acerto IRRF.
		/// </summary>
		/// <param name="entity"></param>
		public void ValidarAcertoIRRF(BusinessEntity.AcertoIRRF entity)
		{			
            if (this.ValidarClienteAssessor(entity))
            {
                DateTime dataMov = this.ObterDataMovimento();

                if (dataMov > entity.DataPregao)
                {
                    if (entity.DiasLiquidacaoAcerto.DiasLiquidacao > 0)
                    {
                        entity.DataLiquidacao = this.ObterProximoDiaUtil(entity);
                    }
                    else
                        entity.DataLiquidacao = entity.DataPregao;
                }
                else
                    throw new BusinessException(ErroDataPregaoInvalida);
            }
            else
                throw new BusinessException(ErroClienteInvalido);
            
		}

		/// <summary>
		/// Verifica se cliente pertence a um dos grupos de assessores do usuário logado e
		/// também se está ativo.
		/// </summary>
		/// <param name="entity"></param>
		public Boolean ValidarClienteAssessor(BusinessEntity.AcertoIRRF entity)
		{
			return _raAcertoIRRF.ValidarClienteAssessor(entity);                        			
		}
		#endregion
	}

}